Use UpperCamelCase when importing modules to distinguish them from ordinary
variables, e.g.
```javascript
- const GLib = imports.gi.GLib;
+ import GLib from 'gi://GLib';
```
Imports should be categorized into one of two places. The top-most import block
should contain only "environment imports". These are either modules from
There are many approaches to classes in JavaScript. We use standard ES6 classes
whenever possible, that is when not inheriting from GObjects.
```javascript
- var IconLabelMenuItem = class extends PopupMenu.PopupMenuBaseItem {
+ export class IconLabelMenuItem extends PopupMenu.PopupMenuBaseItem {
constructor(icon, label) {
super({ reactive: false });
this.actor.add_child(icon);
For GObject inheritance, we use the GObject.registerClass() function provided
by gjs.
```javascript
- var MyActor = GObject.registerClass(
+ export const MyActor = GObject.registerClass(
class MyActor extends Clutter.Actor {
_init(params) {
super._init(params);
bindings for almost any library built around GObject. If a library requires
you to inherit from a type to use it, you can do so:
```javascript
- var MyClutterActor = GObject.registerClass(
+ export const MyClutterActor = GObject.registerClass(
class MyClutterActor extends Clutter.Actor {
vfunc_get_preferred_width(forHeight) {
We sometimes use expando properties to set a property called `_delegate` on
the actor itself:
```javascript
- var MyActor = GObject.registerClass(
+ export const MyActor = GObject.registerClass(
class MyActor extends Clutter.Actor {
_init(params) {
super._init(params);
Or using the deprecated `actor`:
```javascript
- var MyClass = class {
+ export class MyClass {
constructor() {
this.actor = new St.Button({ text: "This is a button" });
this.actor._delegate = this;
```javascript
const FnorbLib = imports.fborbLib;
- var MyClass = class {
- _init() {
+ export class MyClass {
+ constructor() {
let fnorb = new FnorbLib.Fnorb();
fnorb.connect('frobate', this._onFnorbFrobate.bind(this));
}